home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 2002 #3
/
Amiga Plus CD - 2002 - No. 03.iso
/
AmiSoft
/
Dev
/
Src
/
Gl_bmp_load.lha
/
GL_BMP_Load
/
BMP_Cube.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-12-30
|
10KB
|
344 lines
/* BMP_Cube.c
* Rotating and bouncing textured cube
* Demonstrates using of BMP Texture Loader routines
* Author: Norman Walter
* e-mail: walternn@studi.informatik.uni-stuttgart.de
* www: http://www.norman-interactive.com
* Date: 29.12.2002
*
* DISCLAIMER: This software is provided "as is". No representations or
* warranties are made with respect to the accuracy, reliability, performance,
* currentness, or operation of this software, and all use is at your own risk.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
/* AmigaOS includes */
#include <exec/types.h>
/* Our includes */
#include "bmp.h"
#include "bmp.c"
#include "Requesters.h"
#include "Requesters.c"
/* 2.0 Version string for c:Version to find */
UBYTE vers[] = "\0$VER: BMP Cube 1.0";
/* Global Variables */
GLfloat angle = 0.0; // angle for rotation
static GLboolean Animate = GL_TRUE;
/* Variables for GLUT menu */
#define ANIMATE 10
#define POINT_FILTER 20
#define LINEAR_FILTER 21
#define ABOUT 40
#define QUIT 100
/* Texture Information */
#define TEXTURE1 "data/Cover1.bmp"
#define TEXTURE2 "data/Cover2.bmp"
#define TEXTURE3 "data/Cover3.bmp"
#define TEXTURE4 "data/Cover4.bmp"
BITMAPINFOHEADER Cover1Info; // Cover1 texture info header
BITMAPINFOHEADER Cover2Info; // Cover2 texture info header
BITMAPINFOHEADER Cover3Info; // Cover3 texture info header
BITMAPINFOHEADER Cover4Info; // Cover4 texture info header
unsigned char* Cover1Texture; // Cover1 texture data
unsigned char* Cover2Texture; // Cover2 texture data
unsigned char* Cover3Texture; // Cover3 texture data
unsigned char* Cover4Texture; // Cover4 texture data
unsigned int Cover1; // the Cover1 texture object
unsigned int Cover2; // the Cover2 texture object
unsigned int Cover3; // the Cover3 texture object
unsigned int Cover4; // the Cover4 texture object
/* Variable for display list */
static GLuint Cube;
/* Put a Cube object into the display list */
static void Init_Cube(void)
{
GLUquadricObj *q = gluNewQuadric();
Cube = glGenLists(1);
glNewList(Cube, GL_COMPILE);
/* Cube */
gluQuadricNormals(q, GL_SMOOTH);
gluQuadricTexture(q, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, Cover1);
glBegin(GL_QUADS); // top face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glEnd();
glBindTexture(GL_TEXTURE_2D, Cover2);
glBegin(GL_QUADS); // front face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glEnd();
glBindTexture(GL_TEXTURE_2D, Cover3);
glBegin(GL_QUADS); // right face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glEnd();
glBindTexture(GL_TEXTURE_2D, Cover4);
glBegin(GL_QUADS); // left face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glEnd();
glBegin(GL_QUADS); // bottom face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glEnd();
glBegin(GL_QUADS); // back face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, 0.5f, -0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, -0.5f, -0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, -0.5f, -0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, 0.5f, -0.5f);
glEnd();
glEndList();
gluDeleteQuadric(q);
}
/* Load and init texture */
BOOL LoadTextures()
{
// load the Cover1 texture data
Cover1Texture = LoadBMP(TEXTURE1, &Cover1Info);
if (!Cover1Texture)
return FALSE;
// load the Cover2 texture data
Cover2Texture = LoadBMP(TEXTURE2, &Cover2Info);
if (!Cover2Texture)
return FALSE;
// load the Cover3 texture data
Cover3Texture = LoadBMP(TEXTURE3, &Cover3Info);
if (!Cover3Texture)
return FALSE;
// load the Cover4 texture data
Cover4Texture = LoadBMP(TEXTURE4, &Cover4Info);
if (!Cover4Texture)
return FALSE;
// generate the Cover1 texture as a mipmap
glGenTextures(1, &Cover1);
glBindTexture(GL_TEXTURE_2D, Cover1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover1Info.biWidth, Cover1Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover1Texture);
// generate the Cover2 texture as a mipmap
glGenTextures(1, &Cover2);
glBindTexture(GL_TEXTURE_2D, Cover2);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover2Info.biWidth, Cover2Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover2Texture);
// generate the Cover3 texture as a mipmap
glGenTextures(1, &Cover3);
glBindTexture(GL_TEXTURE_2D, Cover3);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover3Info.biWidth, Cover3Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover3Texture);
// generate the Cover4 texture as a mipmap
glGenTextures(1, &Cover4);
glBindTexture(GL_TEXTURE_2D, Cover4);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, Cover4Info.biWidth, Cover4Info.biHeight, GL_RGB, GL_UNSIGNED_BYTE, Cover4Texture);
return TRUE;
}
/* CleanUp memory */
void CleanUp()
{
free(Cover1Texture);
free(Cover2Texture);
free(Cover3Texture);
free(Cover4Texture);
}
/* Simple init routine */
void Initialize(void)
{
glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
glShadeModel(GL_SMOOTH); // use smooth shading
glEnable(GL_DEPTH_TEST); // hidden surface removal
glEnable(GL_CULL_FACE); // do not calculate inside of poly's
glFrontFace(GL_CCW); // counter clock-wise polygons are out
/* fitering = nearest, initially */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
if (LoadTextures()) // Load all textures
{
glEnable(GL_TEXTURE_2D); // enable textures
}
else
{
ShowError(); // display error requester
}
}
/* Render the Scene */
void Render(void)
{
// clear screen and depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.0f, 0.0f, 0.0f); // perform transformations
glRotatef(angle, 1.0f, 0.0f, 0.0f); // place cube at (0,-3) and rotate it
glRotatef(angle, 0.0f, 1.0f, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glScalef(30.0, 30.0, 30.0);
glCallList(Cube); // call object from display list
glPopMatrix();
glutSwapBuffers(); // bring backbuffer to foreground
}
/* Idle function */
void Idle(void)
{
if (Animate)
{
if (angle >= 360.0)
angle = 0.0;
angle+=1.0;
glutPostRedisplay();
}
}
/* Reshape function */
static void Reshape( int width, int height )
{
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -5.0, 5.0, -5.0, 5.0, 10.0, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0, 0.0, -70.0 );
}
/* Menu function for GLUT menu */
static void ModeMenu(int entry)
{
if (entry==ANIMATE) {
Animate = !Animate;
}
else if (entry==POINT_FILTER) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}
else if (entry==LINEAR_FILTER) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
else if (entry==ABOUT) {
ShowAbout();
}
else if (entry==QUIT) {
AskQuit();
}
glutPostRedisplay();
}
/* MAIN function */
int main( int argc, char *argv[] )
{
glutInit( &argc, argv );
glutInitWindowSize( 300, 300 );
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow(argv[0] );
/* Init everything */
Initialize();
Init_Cube();
glutReshapeFunc(Reshape);
glutDisplayFunc(Render);
glutIdleFunc(Idle);
/* Create GLUT Menu */
glutCreateMenu(ModeMenu);
glutAddMenuEntry("Point Filtered", POINT_FILTER);
glutAddMenuEntry("Linear Filtered", LINEAR_FILTER);
glutAddMenuEntry("Toggle Animation", ANIMATE);
glutAddMenuEntry("About", ABOUT);
glutAddMenuEntry("Quit", QUIT);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutMainLoop();
CleanUp();
return 0;
}